package com.example.demo.Controller;

import com.example.demo.model.UserInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: H_tao_X
 * Date: 2022-11-27
 * Time: 23:45
 */
@Slf4j
@Controller
@ResponseBody // 返回非静态页面
@RequestMapping("/user2")  // 一级理由
public class UserController2 {
    /**
     * 服务器获取用户（前端）请求参数
     * 获取到之后，返回到前端页面
     */

    /**
     * 获取单个参数
     * 前端传入的参数，后端获取到之后
     * 将获取到的信息，返回到前端页面
     */
    @RequestMapping("/getuserbyid")
    // 通过 id 获取到 UserInfo 的信息
    public UserInfo getUserById(Integer id) {
        // 此处的 id 一定要和 前端传递的参数名保持一致不然就获取不了参数了
        UserInfo userInfo = new UserInfo();
        userInfo.setId(id == null ? 0 : id);
        userInfo.setUsername("张三");
        userInfo.setPassword("123");
        userInfo.setAge(22);
        return userInfo;
    }

    /**
     * 获取多个参数
     */
    @RequestMapping("/login")
    public String login(String username,String password) {
        return "账号: |" + username + "密码: |" + password;
    }

    /**
     * 获取一个对象
     */
    @RequestMapping("/reg")
    public String reg(UserInfo userInfo) {
        return "用户信息: " + userInfo;
    }

    /**
     * 后端参数重命名
     * 如果前后端 传递参数名称不一样，后端是没办法获取到前端传递的参数的
     * 比如 前端传递的参数名称是 name，而后端接收的参数名是 username
     * 那么 这样子是接收不到前端传递的传输的
     * 我们可以通过@RequserParam("name") String username
     * 来讲 name 重命名 为 username 这样后端就能接收到前端传递的参数信息
     */
    @RequestMapping("/login1")
    public String login1(@RequestParam("name") String username, String password) {
        return "账号: |" + username + "密码: |" + password;
    }

    /**
     * 使用 Postman 模拟发送 json 数据给服务器
     */
    @RequestMapping("/reg1")
    public String reg1(@RequestBody UserInfo userInfo) {
        return "用户信息: " + userInfo;
    }

    /**
     * 获取 URL 地址中的参数
     */
    @RequestMapping("/hero/{id}/{name}")
    public String getHeroInfo(@PathVariable Integer id,@PathVariable String name) {
        return "Id:  |" + id + "Name: |" + name;
    }


    /**
     * 从配置文件中 读取一下配置文件的保存路径
     * @return
     */
    @Value("${img.path}")
    private String imgPath; // 获取对象
    @RequestMapping("/sayhi")
    public String sayHi() {
        return "你好: " + imgPath;
    }

    /**
     * 上传文件 上传文件使用到的注解为： @RequestPart(“前端传递的名称”),使用 MultipartFile 接收
     */

    @RequestMapping("/upimg")
    public boolean upImg(Integer uid, @RequestPart("img") MultipartFile file) {
        boolean result = false; // 默认情况下 认为是 false
        /**
         * 分成 三个步骤
         */
        // 1. 目录 = imgpath,配置文件中已经设置好了目录

        // 2. 图片名称(图片名不能重复) [UUID] // UUID 全局唯一ID

        // 3. 获取原上传图片的格式(不一定是 png 格式)

        String fileName = file.getOriginalFilename(); // 获取原始图片的名称
        fileName = fileName.substring(fileName.lastIndexOf("."));// 得到图片后缀
        fileName = UUID.randomUUID().toString() + fileName;
        try {
            file.transferTo(new File(imgPath + fileName));
            result = true; // 如果上传成功返回true
        } catch (IOException e) {
            // 这里打印一下日志，如果出现异常了，注意我们之前讲过的
            // 日志 我们需要注解 @Slf4j
            log.error("上传图片失败: " + e.getMessage());
        }
        return result;
    }




}
